#include <cstdio>

int inline min( int a, int b ) { return ( a < b )?a :b; }
int inline max( int a, int b ) { return ( a > b )?a :b; }

struct Node
{
    int l, r, min, max, buf;
};

Node a[ 800000 ];
int n, m, P, pos;

void init( )
{
    int i;
    pos = 1;
    while ( pos <= n ) pos <<= 1;
    for ( i = pos; i < pos * 2; i++ )
    {
        a[ i ].l = a[ i ].r = i - pos + 1;
        a[ i ].min = a[ i ].max = a[ i ].buf = 0;
    }
    for ( i = pos - 1; i > 0; i-- )
    {
        a[ i ].l = a[ i * 2 ].l;
        a[ i ].r = a[ i * 2 + 1 ].r;
        a[ i ].min = a[ i ].max = a[ i ].buf = 0;
    }
}

void add( int p, int l, int r, int c )
{
    if ( l > a[ p ].r || r < a[ p ].l ) return ;
    if ( l < a[ p ].l ) l = a[ p ].l;
    if ( r > a[ p ].r ) r = a[ p ].r;
    if ( l == a[ p ].l && r == a[ p ].r )
    {
        if ( a[ p ].min >= P )
        {
            a[ p ].min += c * 2;
            a[ p ].max += c * 2;
            a[ p ].buf += c * 2;
            return ;
        }
        if ( a[ p ].max < P )
        {
            a[ p ].min += c;
            a[ p ].max += c;
            a[ p ].buf += c;
            return ;
        }
        if ( p >= pos ) return ;
    }
    if ( a[ p ].buf )
    {
        a[ p * 2 ].buf += a[ p ].buf; a[ p * 2 ].min += a[ p ].buf; a[ p * 2 ].max += a[ p ].buf;
        a[ p * 2 + 1 ].buf += a[ p ].buf; a[ p * 2 + 1 ].min += a[ p ].buf; a[ p * 2 + 1 ].max += a[ p ].buf;
        a[ p ].buf = 0;
    }
    int mid = ( a[ p ].l + a[ p ].r ) >> 1;
    if ( r <= mid )
        add( p << 1, l, r, c );
    else if ( l > mid )
        add( ( p << 1 ) + 1, l, r, c );
    else
    {
        add( p << 1, l, mid, c );
        add( ( p << 1 ) + 1, mid + 1, r, c );
    }
    a[ p ].max = max( a[ p * 2 ].max, a[ p * 2 + 1 ].max );
    a[ p ].min = min( a[ p * 2 ].min, a[ p * 2 + 1 ].min );
}

int update( int p, int k )
{
    if ( a[ p ].l == k && a[ p ].r == k ) return a[ p ].min;
    if ( a[ p ].buf )
    {
        a[ p * 2 ].buf += a[ p ].buf; a[ p * 2 ].min += a[ p ].buf; a[ p * 2 ].max += a[ p ].buf;
        a[ p * 2 + 1 ].buf += a[ p ].buf; a[ p * 2 + 1 ].min += a[ p ].buf; a[ p * 2 + 1 ].max += a[ p ].buf;
        a[ p ].buf = 0;
    }
    int mid = ( a[ p ].l + a[ p ].r ) >> 1;
    if ( k <= mid ) return update( p << 1, k );
    else return update( ( p << 1 ) + 1, k );
}

void work( )
{
    int i, x, y, z;
    for ( i = 0; i < m; i++ )
    {
        scanf("%d%d%d", &x, &y, &z);
        add( 1, x, y, z );
    }
    printf("%d", update( 1, 1 ));
    for ( i = 1; i < n; i++ )
        printf(" %d", update( 1, i + 1 ));
    puts("");
}

int main( )
{
    while ( scanf("%d%d%d", &n, &m, &P) != EOF )
    {
        init( );
        work( );
    }
    return 0;
}
